/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SysAguas.dao;

/**
 *
 * @author Heitor
 */
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class DAOGenerico {

    protected static EntityManagerFactory fabrica;
    protected static EntityManager gerenciador;

    static {
        fabrica = Persistence.createEntityManagerFactory("SysAguasBetaPU");
        gerenciador = fabrica.createEntityManager();
    }

    public void cadastrar(Object o) {
        abreConexao();
        begin();
        gerenciador.persist(o);
        gerenciador.getTransaction().commit();
        fechaConexao();
    }

    public void remover(Object o) {
        abreConexao();
        begin();
        Object x = gerenciador.merge(o);
        gerenciador.remove(x);
        gerenciador.getTransaction().commit();
        fechaConexao();
    }

    public <T> T consultarPorChave(Class<T> classe, Integer n) {
        abreConexao();
        T toReturn = null;
        toReturn = gerenciador.find(classe, n);
        fechaConexao();
        return toReturn;
    }

    public <T> Integer getIdOfTable(Class<T> classe, String jpql, Object... parametros) {
        Integer id = null;
        abreConexao();
        begin();
        Query query = gerenciador.createQuery(jpql);
        for (int i = 0; i < parametros.length; i++) {
            query.setParameter(i + 1, parametros[i]);
        }
        id = (Integer) query.getSingleResult();
        gerenciador.getTransaction().commit();
        fechaConexao();

        return id;

    }

    public void atualizar(Object atualizado) {
        abreConexao();
        begin();
        gerenciador.merge(atualizado);
        gerenciador.getTransaction().commit();
        fechaConexao();
    }

    protected <T> List<T> getLista(Class<T> classe, String jpql, Object... parametros) {
        abreConexao();
        begin();
        List<T> toReturn = null;
        Query query = gerenciador.createQuery(jpql);
        for (int i = 0; i < parametros.length; i++) {
            query.setParameter(i + 1, parametros[i]);

        }
        toReturn = query.getResultList();
        gerenciador.getTransaction().commit();
        fechaConexao();

        return toReturn;
    }

    public EntityManager getEntityManeger() {
        return gerenciador;

    }

    public void abreConexao() {
        if (!gerenciador.isOpen()) {
            if (!fabrica.isOpen()) {
                fabrica = Persistence.createEntityManagerFactory("SysAguasBetaPU");
                gerenciador = fabrica.createEntityManager();
            }
        }
    }

    public void fechaConexao() {
        if (gerenciador.isOpen()) {
            if (fabrica.isOpen()) {
                gerenciador.close();
                fabrica.close();
            }

        }
    }

    public void begin() {
        if (!gerenciador.getTransaction().isActive()) {
            gerenciador.getTransaction().begin();

        }
    }
}
